#include "my_inc/main_login.h"

// 检测滑动回调函数
void event_handler(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);

    if(code == LV_EVENT_GESTURE) {
        lv_indev_t * indev = lv_indev_get_act();
        if(indev == NULL) return;

        // 获取手势方向
        lv_dir_t dir = lv_indev_get_gesture_dir(indev);

        switch(dir) {
            case LV_DIR_LEFT: printf("检测到向左滑动手势\n"); break;
            case LV_DIR_RIGHT: printf("检测到向右滑动手势\n"); break;
            case LV_DIR_TOP: printf("检测到向上滑动手势\n"); break;
            case LV_DIR_BOTTOM: printf("检测到向下滑动手势\n"); break;
            default: printf("未知手势方向\n"); break;
        }
    }
}

/**
 * @brief 刷新游戏UI
 */
void refresh_game_ui(lv_obj_t * cont_game, int data[FOUR][FOUR])
{
    if(!cont_game) return;

    // 删除现有的所有子对象（方块）
    lv_obj_clean(cont_game);

    // 重新创建4x4游戏方块
    for(int i = 0; i < 4; i++) {
        for(int j = 0; j < 4; j++) {
            lv_obj_t * tile   = lv_obj_create(cont_game);
            uint32_t bg_color = get_tile_color(data[i][j]);

            lv_obj_set_style_bg_color(tile, lv_color_hex(bg_color), LV_PART_MAIN);
            lv_obj_set_style_border_width(tile, 2, LV_PART_MAIN);
            lv_obj_set_style_border_color(tile, lv_color_hex(0x776e65), LV_PART_MAIN);
            lv_obj_set_style_radius(tile, 4, LV_PART_MAIN);

            lv_obj_t * tile_label = lv_label_create(tile);

            if(data[i][j] == 0) {
                lv_obj_set_style_bg_opa(tile, LV_OPA_0, LV_PART_MAIN);
                lv_obj_set_style_border_opa(tile, LV_OPA_50, LV_PART_MAIN);
                lv_label_set_text(tile_label, "");
            } else {
                char num_str[10];
                snprintf(num_str, sizeof(num_str), "%d", data[i][j]);
                lv_label_set_text(tile_label, num_str);
            }

            lv_obj_set_style_text_font(tile_label, &lv_font_montserrat_24, 0);
            lv_obj_center(tile_label);
            lv_obj_set_grid_cell(tile, LV_GRID_ALIGN_STRETCH, j, 1, LV_GRID_ALIGN_STRETCH, i, 1);
        }
    }
}

void menu_game(lv_event_t * e)
{
    menu_p m_t = lv_event_get_user_data(e);
    if(!m_t->btn_state) {
        lv_obj_clear_flag(m_t->obj, LV_OBJ_FLAG_HIDDEN); // 显示OBJ
        m_t->btn_state = 1;
    } else {
        lv_obj_add_flag(m_t->obj, LV_OBJ_FLAG_HIDDEN); // 隐藏OBJ
        m_t->btn_state = 0;
    }
}

void reset_game(lv_event_t * e)
{
    menu_p m_p = (menu_p)lv_event_get_user_data(e); // 获取事件传递的用户数据（menu_p结构体指针）
    if(!m_p || !m_p->head) return;                  // 安全检查：确保m_p和链表头指针有效

    // 1. 完全重置游戏数据
    for(int i = 0; i < FOUR; i++) {
        for(int j = 0; j < FOUR; j++) {
            data[i][j] = 0;
        }
    }

    // 2. ⭐️ 只写入两个数字（与游戏开始时一致）
    write_2048(data); // 第一个数字
    write_2048(data); // 第二个数字

    // 3. 重置游戏状态 - 通过指针修改全局变量
    if(m_p->g_current_score) {
        *(m_p->g_current_score) = 0;
    }
    set_config(1);
    if(m_p->g_game_state) {
        *(m_p->g_game_state) = GAME_RUNNING;
    }

    // 5. 更新UI - 使用全局变量确保显示正确
    if(m_p->g_cont_game) {
        refresh_game_ui(m_p->g_cont_game, data);
    }
    if(m_p->g_score_label) {
        update_score_display(m_p->g_current_score);
    }

    // 6. 调试信息：显示当前棋盘数字数量
    int count = 0;
    for(int i = 0; i < FOUR; i++) {
        for(int j = 0; j < FOUR; j++) {
            if(data[i][j] != 0) count++;
        }
    }
    // // 1. 停止并删除游戏定时器 - 防止定时器回调继续执行
    //     if(m_p->g_game_timer) {
    //         lv_timer_del(m_p->g_game_timer); // 删除LVGL定时器
    //         m_p->g_game_timer = NULL;        // 将指针置空，避免悬空指针
    //     }
        // // 添加：重置分数显示
        if(m_p->g_score_label) {
            update_score_display(0);
        }
    lv_obj_add_flag(m_p->game_over_label, LV_OBJ_FLAG_HIDDEN); // 隐藏OBJ
}

/**
 * @brief 返回主界面事件处理函数
 * @param e LVGL事件对象
 * @note 此函数处理返回主界面的逻辑，包括游戏资源的清理
 */
void home_game(lv_event_t * e)
{
    // 获取事件传递的用户数据（menu_p结构体指针）
    menu_p m_p = (menu_p)lv_event_get_user_data(e);
    // 安全检查：确保m_p和链表头指针有效
    if(!m_p || !m_p->head) return;

    // 获取触发事件的按钮对象
    lv_obj_t * btn = lv_event_get_target(e);
    // 获取按钮的第一个子对象（通常是标签）
    lv_obj_t * label = lv_obj_get_child(btn, 0);
    // 获取按钮文本内容，用于判断是哪个按钮触发的事件
    const char * btn_text = lv_label_get_text(label);

    // 在链表中查找名为"主界面"的页面节点
    face_p main_face = find(m_p->head, "主界面");
    // 安全检查：确保找到主界面且屏幕对象有效
    if(!main_face || !main_face->screen) return;

    // 获取主界面的屏幕对象
    lv_obj_t * scr = main_face->screen;

    // 判断是否是返回按钮（左箭头符号）触发的事件
    if(!strcmp(btn_text, LV_SYMBOL_LEFT)) {
        // 如果是返回按钮，执行游戏资源清理操作
        reset_game(e);
        // // 1. 停止并删除游戏定时器 - 防止定时器回调继续执行
        // if(m_p->g_game_timer) {
        //     lv_timer_del(m_p->g_game_timer); // 删除LVGL定时器
        //     m_p->g_game_timer = NULL;        // 将指针置空，避免悬空指针
        // }
        // // 添加：重置分数显示
        if(m_p->g_score_label) {
            update_score_display(0);
        }
        lv_obj_add_flag(m_p->game_over_label, LV_OBJ_FLAG_HIDDEN); // 隐藏OBJ
        lv_obj_add_flag(m_p->obj, LV_OBJ_FLAG_HIDDEN); // 隐藏OBJ
    }
    // 注意：其他按钮（如HOME按钮）直接返回主界面，不清理游戏资源

    // 加载主界面屏幕
    lv_scr_load(scr);
}

// /**
//  * @brief 清理游戏资源但不删除链表
//  * @param m_p 游戏菜单指针，包含游戏状态和资源信息
//  * @note 此函数只清理动态分配的资源，保持链表结构完整
//  *       用于游戏退出时的资源释放，避免内存泄漏
//  */
// void cleanup_game_resources(menu_p m_p)
// {
//     // 安全检查：确保m_p有效
//     if(!m_p) return;

//     // 1. 停止并删除游戏定时器 - 防止定时器回调继续执行
//     if(m_p->g_game_timer) {
//         lv_timer_del(m_p->g_game_timer);  // 删除LVGL定时器
//         m_p->g_game_timer = NULL;         // 将指针置空，避免悬空指针
//     }

//     // 2. 重置游戏状态变量 - 通过指针重置全局变量
//     if(m_p->g_current_score) {
//         *(m_p->g_current_score) = 0;             // 通过指针重置分数为0
//     }
//     if(m_p->g_game_state) {
//         *(m_p->g_game_state) = GAME_RUNNING;     // 通过指针重置游戏状态
//     }

//     // 3. 清空指针引用
//     m_p->g_cont_game = NULL;              // 清空游戏容器指针
//     m_p->g_score_label = NULL;            // 清空分数标签指针

//     // 4. 重置游戏数据 - 清空游戏棋盘数据
//     for(int i = 0; i < FOUR; i++) {
//         for(int j = 0; j < FOUR; j++) {
//             data[i][j] = 0;               // 将每个方格的值重置为0
//         }
//     }

//     // 添加：确保游戏数据完全重置
//     for(int i = 0; i < FOUR; i++) {
//         for(int j = 0; j < FOUR; j++) {
//             data[i][j] = 0;
//         }
//     }

//     // 添加：重新生成初始数字
//     write_2048(data);
//     write_2048(data);

// // 添加：重置分数显示
// if(m_p->g_score_label) {
//     update_score_display(0);
// }

//     printf("游戏资源已彻底清理，棋盘已重置\n");
// }
